package core;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;

import exceptions.AppCursoExceptions;

public class ClienteDAO
{

	private static final ClienteDAO instance = new ClienteDAO();
	private Connection connection;

	private ClienteDAO ()
	{
		try
		{
			Class.forName("com.mysql.jdbc.Driver");
			this.connection=DriverManager.getConnection("jdbc:mysql://192.168.101.90/db_gmonti","gmonti","cap2014");
		}
		catch (SQLException | ClassNotFoundException e)
		{
			throw new AppCursoExceptions ("Error al acceder a la base de datos", e);
		}
		
	}

	public static ClienteDAO getInstance()
	{
		return ClienteDAO.instance;
	}


	public void Delete(int id)
	{
		String sql="DELETE FROM Cliente "
				+ "WHERE id=?";
		PreparedStatement pSt;
		try
		{
			pSt = connection.prepareStatement(sql);
			pSt.setInt(1, id);
			int var = pSt.executeUpdate();
			System.out.println("Eliminados: " + var);
		}
		
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
		
	}
	
	public List<Cliente> getClientes()
	{
		try
		{	
			List<Cliente> listaClientes = new ArrayList<> ();
			String sql="SELECT * FROM Cliente";
			Statement ste = connection.createStatement();
			ResultSet rst = ste.executeQuery(sql);
			while (rst.next())
			{
				Cliente cliente = new Cliente();
				cliente.setId(rst.getInt("Id"));
				cliente.setNombre(rst.getString("Nombre"));
				cliente.setDireccion(rst.getString("Direccion"));
				cliente.setDescripcion(rst.getString("descripcion"));
				listaClientes.add(cliente);
			}
			return listaClientes;
		}
		catch (SQLException e)
		{
			throw new AppCursoExceptions ("Error al acceder a Cliente", e);
		}
	}
	
	public Cliente unCliente(int id)
	{
		System.out.println("unCliente para id " + id);
		try
		{	
			String sql="SELECT * FROM Cliente WHERE id=?";
			PreparedStatement ste = connection.prepareStatement(sql);
			ste.setInt(1, id);
			
			ResultSet rSt = ste.executeQuery();
			if(rSt.next())
			{
				Cliente cliente = new Cliente();
				cliente.setId(rSt.getInt("Id"));
				cliente.setNombre(rSt.getString("Nombre"));
				cliente.setDireccion(rSt.getString("Direccion"));
				cliente.setDescripcion(rSt.getString("descripcion"));
				
				return cliente;
			}
			else
			{
				System.out.println("No se encontro el cliente para id " + id);
				return null;
			}
		}
		catch (SQLException e)
		{
			throw new AppCursoExceptions ("Error al acceder a Cliente", e);
		}
	}

	public void crear(Cliente cliente) {
		StringBuffer buf = new StringBuffer(100);
		buf.append("insert into Cliente ");
		buf.append(" (Nombre, Direccion, descripcion) ");
		buf.append(" values ");
		buf.append(" (?, ?, ?) ");
		
		PreparedStatement pSt;
		try
		{
			pSt = connection.prepareStatement(buf.toString(), Statement.RETURN_GENERATED_KEYS);
			pSt.setString(1, cliente.getNombre());
			pSt.setString(2, cliente.getDireccion());
			pSt.setString(3, cliente.getDescripcion());
			
			int var = pSt.executeUpdate();
			
			System.out.println("Insertados: " + var);
			
			ResultSet rs = pSt.getGeneratedKeys();
			if (rs.next()) {
				cliente.setId(rs.getInt(1));
				System.out.println("Insertados con Id: " + cliente.getId());
			}
			
		} catch (SQLException e)  {
			throw new AppCursoExceptions("Error al crear Cliente", e);
		}
		
	}

	public void actualizar(Cliente cliente) {
		// TODO Auto-generated method stub
		throw new AppCursoExceptions("Metodo no implementado!!!!!");
	}
}
